package sunyu.toolkit.core;

import jodd.datetime.JDateTime;
import org.nutz.lang.Stopwatch;
import org.nutz.lang.Times;

import java.util.Date;

/**
 * 时间工具类
 *
 * @author 孙宇
 */
public class TimeKit extends Times {

    /**
     * 计算两个日期相差多少天
     *
     * @param d1 日期1
     * @param d2 日期2
     * @return 相差多少天(这里取了绝对值，所以两个日期可以没有顺序)
     */
    public static long getDays(Date d1,
                               Date d2) {
        long l = getHour(d1, d2);
        return Math.abs(l / 24);
    }

    /**
     * 计算两个日期相差多少小时
     *
     * @param d1 日期1
     * @param d2 日期2
     * @return 相差多少小时
     */
    public static long getHour(Date d1,
                               Date d2) {
        long l = getMinute(d1, d2);
        return Math.abs(l / 60);
    }

    /**
     * 计算两个日期相差多少分钟
     *
     * @param d1 日期1
     * @param d2 日期2
     * @return 相差多少分钟
     */
    public static long getMinute(Date d1,
                                 Date d2) {
        long l = getSeconds(d1, d2);
        return Math.abs(l / 60);
    }

    /**
     * 计算两个日期相差多少秒
     *
     * @param d1 日期1
     * @param d2 日期2
     * @return 相差多少秒
     */
    public static long getSeconds(Date d1,
                                  Date d2) {
        long l = d1.getTime() - d2.getTime();
        return Math.abs(l / 1000);
    }

    /**
     * 添加或减少n秒
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addSecond(Date date,
                                 int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addSecond(n);
        return jdt.convertToDate();
    }

    /**
     * 添加或减少n分钟
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addMinute(Date date,
                                 int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addMinute(n);
        return jdt.convertToDate();
    }

    /**
     * 添加或减少n小时
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addHour(Date date,
                               int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addHour(n);
        return jdt.convertToDate();
    }

    /**
     * 添加或减少N天
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addDay(Date date,
                              int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addDay(n);
        return jdt.convertToDate();
    }

    /**
     * 添加或减少N月
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addMonth(Date date,
                                int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addMonth(n);
        return jdt.convertToDate();
    }

    /**
     * 添加或减少n年
     *
     * @param date 日期
     * @param n    偏移量
     * @return 偏移后的日期
     */
    public static Date addYear(Date date,
                               int n) {
        JDateTime jdt = new JDateTime(date);
        jdt.addYear(n);
        return jdt.convertToDate();
    }

    /**
     * 获得一个开启的秒表
     *
     * @return 秒表对象
     */
    public static Stopwatch beginStopwatch() {
        return Stopwatch.begin();
    }

}
